package com.test.mybatis.test;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.test.mybatis.dao.EmployeeMapper;
import com.test.mybatis.entities.Employee;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;

/**
 * @author lzy
 * @version v1.0
 * Create DateTime: 2018/11/21 9:20
 */
@Slf4j
public class PluginTestDemo {

    private SqlSession session;
    private EmployeeMapper mapper;

    @Before
    public void before() throws IOException {
        //1获取sessionFactory对象
        SqlSessionFactory factory = getSqlSessionFactory();
        //2.获取sqlSession对象
        session = factory.openSession();
        //3.获取接口的实现类
        //会为接口自动的创建一个代理对象，代理对象去执行增删改查操作方法
        this.mapper = session.getMapper(EmployeeMapper.class);
    }

    @After
    public void after() {
        this.session.close();
    }

    private SqlSessionFactory getSqlSessionFactory() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        return new SqlSessionFactoryBuilder().build(inputStream);
    }

    /**
     * 在四大对象创建的时候：
     * 1.每个创建出来的对象不是直接返回，而是调用pluginAll()方法进行了包装
     * 2.获取到所有的Interceptor（拦截器：插件需要实现的接口）
     * 调用interceptor.plugin(target);返回target包装后的对象
     * 3.插件机制，可以使用插件为目标对象创建一个代理对象：AOP（面向切面）
     * 插件可以为四大对象创建出代理对象
     * 代理对象就可以拦截到四大对象的每一个执行
     * <p>
     * 插件的编写：
     * 1.编写Interceptor接口的实现类
     * 2.使用@Intercepts注解完成插件签名
     * 3.将写好的插件注册到全局配置文件中
     */
    @Test
    public void testPlugin() {
        Employee employee = mapper.getEmpById(4);
        log.info("employee:{}", employee);
    }

    @Test
    public void testPage() {
        Page<Employee> page = PageHelper.startPage(2, 10);
        log.info("page:{}", page);
        List<Employee> employees = mapper.getEmps();
        log.info("employees:{}", Arrays.toString(employees.toArray()));
        // navigatePages:连续显示的页码
        PageInfo<Employee> pageInfo = new PageInfo<>(employees, 5);
    }
}
